iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 23
0

繼承

繼承表達的就是一種相互關係,它讓新類別可以從已存在的類別那裡獲得已有的特徵,也就是子類別會繼承父類別所擁有的東西。如此一來,子類別就不必重複撰寫父類別有的東西,若有需要再進行修改或新增,提供客製化的介面。

繼承的特點主要為三:
1. 程式重複使用

將已存在的父類別作為基礎,子類別只要透過繼承,就能使用父類別裡的程式碼,簡單快速不重複!

2. 統一共同屬性和行為

繼承確保子類別都具有父類別的屬性和行為。若沒有繼承機,分別建立在許多類別裡的東西可能會發生容錯現象和相容問題。

3. 程式更簡潔、易擴充

繼承確保軟體模組的再使用性和獨立性,可縮短開發週期,加強軟體開發效率,同時使軟體易於擴充和維護。


語法

繼承的語法格式為:

class 子類別名稱(父類別名稱):
    定義子類別新特性...

只是在子類別後面加上父類別名稱而已,那我們可以拿昨天狗狗的例子:

class Dog:   
    def __init__(self,name,color):
        self.name = name             
        self.color = color             
        
    def bark(self):
        print("汪!汪!汪!我是"+self.name+"!")

今天要在程式碼裡加入一種特殊的狗狗---"導盲犬",那麼同樣是狗便能繼承Dog類別(父類別)裡的東西,之後再定義自己的方法,如下:

class Dog:   
    def __init__(self,name,color):
        self.name = name             
        self.color = color             
        
    def bark(self):
        print("汪!汪!汪!我是"+self.name+"!")

#定義GuideDog類別
class GuideDog(Dog):          #繼承Dog類別
    def guide(self):
        print("我正在引導主人!不要妨礙我!")

Gdog = GuideDog("大黃","黃")
Gdog.bark()                     #呼叫繼承的bark()方法
Gdog.guide()                    #呼叫自己的guide()方法
--------------------------------
汪!汪!汪!我是小黃!
我正在引導主人!不要妨礙我!

上面例子中,因為GuideDog的初始化與Dog類別的__init__()方法相同,所以沒有重新定義。如果要在GuideDog類別定義自己的__init__()方法,同時要擁有Dog類別的__init__()方法,就需要用super()函式。它會呼叫父類別的建構式,比其他呼叫方式都來的簡單方便,如下:

class Dog:   
    def __init__(self,name,color):
        self.name = name             
        self.color = color             
        
    def bark(self):
        print("汪!汪!汪!我是"+self.name+"!")

#定義GuideDog類別
class GuideDog(Dog):
    #定義自己的__init__()方法
    def __init__(self,name,color,year):
         super().__init__(name,color)        #用super()函式呼叫父類別__init__()方法
         self.workyear = year
    def guide(self):
        print("我正在引導主人!不要妨礙我!")
        print("我有%d年的工作經歷~"%self.workyear)

Gdog = GuideDog("大黃","黃",3)
Gdog.bark()
Gdog.guide()
--------------------------------
汪!汪!汪!我是大黃!
我正在引導主人!不要妨礙我!
我有3年的工作經歷~

多重繼承

多重繼承就是字面上的意思,想要繼承兩個以上的父類別時,只要在子類別後面繼續增加就行,直接看例子吧!

class Dog:   
    def __init__(self,name):
        self.name = name                        
        
    def bark(self):
        print("我是"+self.name+"!我會學狗叫'汪!汪!汪!'")

    def play(self):
        print("他們喜歡球!!!")

class Cat:   
    def __init__(self,name):
        self.name = name                         
        
    def meow(self):
        print("我是"+self.name+"!我會學喵叫'喵!喵!喵!'")

    def play(self):
        print("他們不太喜歡動...")

class human(Dog,Cat):                 #多重繼承
    def like(self):
        print("我喜歡寵物!")

a = human('小明')
a.bark()
a.meow()
a.like()
a.play()                             #只呼叫前面父類別Dog
--------------------------------
我是小明!我會學狗叫'汪!汪!汪!'
我是小明!我會學喵叫'喵!喵!喵!'
我喜歡寵物!
他們喜歡球!!!

要注意的地方是,Dog跟Cat類別裡同樣都有play()方法,因此在繼承時,Dog類別排在前面,會優先被繼承,所以顯示的結果都會是Dog類別裡的歐!

明天再來講更多這類似問題~

參考資料

  • 書名-大數據起步從Python開始 /吳萍-編著
  • 書名-輕鬆學Python3 /孫宏明-編著

上一篇
Day22-類別
下一篇
Day24-多型
系列文
Python 30天學習日誌30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言